import plotly.express as px
import plotly.io as pio
pio.renderers.default = "iframe"
df = px.data.iris()
fig = px.scatter(df, x="sepal_width", y="sepal_length", color="species")
fig.show()Space-borne LiDAR comparable pairs for small-scale analyses
Main ideas
- There is a lot of challenges for small-scale analysis using GEDI data for before and after disturbance comparisons (East et al. 2023; Mandl et al. 2023).
Hypothesis: If comparability is compromised due to errors associated to specific covariates between shots (e.g. Topography, Land Cover, Tree species), then a method could be developed to mitigate those errors and make pairs more comparable.
Solution proposed: A systematic way to get comparable GEDI metrics should be developed.
Literature review
Questions that I want to answer:
- What methods have been used to obtain comparable space-borne LiDAR measurements over small areas (How small is small)?
- What are the main challenges and best practices in comparing measurements from GEDI, ICESat-2, or other space-borne LiDAR datasets and how do researchers deal with them?
- Vertical accuracy, geo-location error
- Temporal resolution (Time between shots and disturbances)
- How is vertical accuracy affected by land cover and topography.
- What pre-processing techniques (e.g. filtering, interpolation) are used?
- Describe Amelia’s, Milenkovic’s and Pronk’s thorough filtering process.
- Describe Ji’s waveform pre-processing and slope correction and the potential of extrapolating that to two near-coincident shots (?)
Methods used to obtain comparable GEDI measurements
Holcomb et al. (2024) developed a method to examine forest changes using nearby GEDI footprints. These nearby GEDI footprints were chosen using a 40 meter threshold. They showed that GEDI is able to capture biomass/canopy height losses after disturbances in a 30x30m resolution and at a population level.
Different approaches not using spatially coincident pairs have also been considered before. For instance, to study the effects of fires in Portugal and Spain, Guerra-Hernández et al. (2024) aggregated GEDI footpints overlapping the burned area, before and after the fire occured. With this they estimated the average AGBD loss caused by the fire.
Main challenges while comparing space-borne LiDAR data
Factors that can lead to systematic biases in canopy height estimations, complicating comparisons:
Geo-location errors
GEDI footprints have a geo-location error of approximately 10.2 m. Low geolocation accuracy can cause errors on the calculation of ground elevation. Moreover, on heterogenous canopies, geolocation error can cause the measurement to be taken over a different part of the canopy than the one presented.
Big improvements related to geolocation error have taken place passing from GEDI v1 to v2 (Pronk, Eleveld, and Ledoux 2024). Additionally, researchers have also worked on improving the geolocation accuracy using high-res DEMs (Schleich et al. 2023).
Terrain slope
The terrain slope significantly affects spaceborne LiDAR measurements. On sloped terrain, laser pulses reflect from both vegetation and the ground simultaneously, leading to overlapping signals and complicating the separation of canopy and ground returns (Ji et al. 2024). The maximum error for rh estimation associated to sloped terrains can be modeled as \(max(\epsilon) = \frac{1}{2}*D*tan(slope)\) and is presented on Figure 1.
Temporal resolution
When actual pairs are found, another big challenge is to evaluate if these pairs can be comparable based on what has happened during the time between shots. East et al. (2023) found for instance that structural changes vary as a function of time after disturbance (Initially seen on lower layers, then on upper canopy).
The time between GEDI pairs used for the study on the amazon rainforest range from 5 to 1422 dyas with an average of time between shots of 522 days.
Land cover
For the specific case of ground elevation, Urbazaev et al. (2022) assessed the effects of different landcovers on the accuracy of GEDI and ICESat’s estimations. They found that mean errors were less than 1m for all LC except for tropical forests where errors ranged from 1.75 to 5.56 meters.
In forests with dense, multi-layered canopies, the GEDI laser pulse might be intercepted by upper canopy elements, preventing it from reaching the ground. This can lead to an overestimation of canopy height or an inaccurate ground elevation reading, affecting the overall height calculation. (Citation ?)
An initial experiment was performed using pairs of GEDI measurements that overlap with MODIS BA on different types of land cover. The results are shown on Figure 3.
Preprocessing techniques for spaceborne LiDAR pair handling
Filtering techniques
Describe here filters used by Holcomb et al. (2024) & Milenković et al. (2022).
Ground and canopy height correction
Methods to improve the comparability of space-borne LiDAR pairs have been developed recently (Specifically, these methods could improve the vertical accuracy of GEDI). Ji et al. (2024) used overlapping pairs of GEDI and ICE-Sat to improve the calculation of ground elevation and thus ameliorate the canopy height calculations. These overlapping pairs were then used to assess their capability to detect deforestation in Brazil.
Other researchers have mainly focused on filtering GEDI data, based on quality assessments and/or variables that could influence it Pronk, Eleveld, and Ledoux (2024)
Geographic stratification of GEDI data
Chen et al. (2023) performed a geographic stratification based on topographic and vegetation features to map AGB. Their results showed that using a stratified sample technique improved the accuracy of AGB estimates by up to 34.8%.
ALS data for possible validation/calibration
- Data from PNOA LiDAR project in Spain is freely accessible and could be used to check on vegetation structure parameters (1ra cobertura until 2015, 2da cobertura until 2022)
- This data could be used for many things:
- Simulation of structural changes over time as a space-for-time substitution (Check gradient of different structural variables).
- High resolution assessment of vegetaion structural changes after fire.
- Creation of simulated footprints for pre-fire measurements and then combination with real GEDI footprints (Like Huettermann et al. (2023)).
- This data could be used for many things:
gediDB
import geopandas as gpd
import gedidb as gdb
# Instantiate the GEDIProvider
provider = gdb.GEDIProvider(
storage_type='s3',
s3_bucket="dog.gedidb.gedi-l2-l4-v002",
url="https://s3.gfz-potsdam.de"
)
# Load region of interest (ROI)
region_of_interest = gpd.read_file('../MougueirasFire.geojson')
# Define variables to query and quality filters
vars_selected = ["agbd", 'wsci']
# Query data
gedi_data = provider.get_data(
variables=vars_selected,
query_type="bounding_box",
geometry=region_of_interest,
start_time="2019-09-26",
end_time="2020-09-27",
return_type='dataframe'
)
gdf = gpd.GeoDataFrame(gedi_data, geometry=gpd.points_from_xy(x= gedi_data['longitude'], y = gedi_data['latitude']))
gdf.crs = 4326
gedi_ba = gpd.sjoin(gdf, region_of_interest, how='inner')import plotly.figure_factory as ff
import plotly.express as px
px.set_mapbox_access_token('pk.eyJ1IjoibWRvbWluZ3VlemQiLCJhIjoiY2xodGY5NWtvMDVidDNwcGJyNGFhZGV5byJ9.8vuMo0BXgq9605Bq8wmwCg')
fig = ff.create_hexbin_mapbox(
data_frame=gedi_ba, lat="latitude",
lon="longitude", color = 'agbd',
color_continuous_scale = 'Greens', agg_func=np.mean,
nx_hexagon=15, opacity=0.9, labels={"color": "agbd"},
)
fig.update_layout(margin=dict(b=0, t=0, l=0, r=0))
fig.show()# Query data
gedi_data = provider.get_data(
variables=vars_selected,
query_type="bounding_box",
geometry=region_of_interest,
start_time="2020-09-27",
end_time="2021-09-26",
return_type='dataframe'
)
gdf = gpd.GeoDataFrame(gedi_data, geometry=gpd.points_from_xy(x= gedi_data['longitude'], y = gedi_data['latitude']))
gdf.crs = 4326
gedi_ba = gpd.sjoin(gdf, region_of_interest, how='inner')
px.set_mapbox_access_token('pk.eyJ1IjoibWRvbWluZ3VlemQiLCJhIjoiY2xodGY5NWtvMDVidDNwcGJyNGFhZGV5byJ9.8vuMo0BXgq9605Bq8wmwCg')
fig = ff.create_hexbin_mapbox(
data_frame=gedi_ba, lat="latitude",
lon="longitude", color = 'agbd',
color_continuous_scale = 'Greens', agg_func=np.mean,
nx_hexagon=15, opacity=0.9, labels={"color": "agbd"},
)
fig.update_layout(margin=dict(b=0, t=0, l=0, r=0))
fig.show()